首页 > 试题广场 >

合法的括号字符串

[编程题]合法的括号字符串
  • 热度指数:11988 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个字符串s,字符串s只包含以下三种字符: (,*,),请你判断 s是不是一个合法的括号字符串。合法括号字符串有如下规则:
1.左括号'('必须有对应的右括号')'
2.右括号')'必须有对应的左括号'('
3.左括号必须在对应的右括号前面
4.*可以视为单个左括号,也可以视为单个右括号,或者视为一个空字符
5.空字符串也视为合法的括号字符串

数据范围:

示例1

输入

"()()"

输出

true
示例2

输入

"((*)"

输出

true
示例3

输入

"(*)"

输出

true
示例4

输入

"(((*)"

输出

false
class Solution:
    def isValidString(self , s: str) -> bool:
        l = []
        star = []
        for i in range(len(s)):
            if s[i] == '(':
                l.append(i)
            elif s[i] == '*':
                star.append(i)
            elif s[i] == ')':
                if l:
                    l.pop()
                elif star:
                    star.pop()
                else:
                    return False
        if len(l) > len(star):
            return False
        i = j = 0
        while l and j < len(star):
            if l[i] < star[j]:
                l.pop(i)
                star.pop(j)
            else:
                j += 1
        if l == []:
            return True
        else:
            return False

发表于 2023-04-10 23:24:08 回复(0)
括号匹配的的关键:在从左到右遍历字符串的时候,对于每一个右括号,左边都有至少1个左括号供消耗;最终结束时,左括号至少可以为0个。对于*号,分别计算其可以形成至多和至少多少个左括号就行了。
发表于 2022-09-02 14:56:20 回复(0)
class Solution:
    def isValidString(self , s: str) -> bool:
        if s[0] == ')':
            return False
        dic = {')': '(', '*': '*'}
        res,res2,res3 = [],[],[]
        start = 0
        for i in range(len(s)):
            if s[i] not in dic.keys():
                res.append(s[i])
                res2.append(i)
            else:
                if s[i] == "*":
                    start += 1
                    res3.append(i)
                elif len(res) > 0:
                    res.pop()
                    res2.pop()
        if len(res) == 0:
            return True
        elif len(res) <= start:
            while res2:
                if res2[-1] > res3[-1]:
                    return False
                else:
                    res2.pop()
                    res3.pop()
            return True
        else:
            return False
    

发表于 2022-01-23 08:36:03 回复(0)